/**
 * 字符串操作模块使用示例 (zh-string.js)
 * 此模块提供中文命名的字符串封装，支持丰富的字符串处理功能
 */

// 支持 CommonJS 和 ES 模块导入
const stringModule = require('../../zh/公共函数/zh-string.js');
const { 字符串 } = stringModule || {
  字符串: stringModule.字符串 || stringModule.default
};

console.log('=== 字符串操作模块 (zh-string.js) 使用示例 ===\n');

// ===== 1. 基本创建和初始化 =====
console.log('1. 基本创建和初始化:');
const 空字符串 = new 字符串();
const 普通字符串 = new 字符串('Hello World');
const 数字转字符串 = new 字符串(12345);
const 对象转字符串 = new 字符串({name: '测试'});

console.log('空字符串:', 空字符串.值());
console.log('普通字符串:', 普通字符串.值());
console.log('数字转字符串:', 数字转字符串.值());
console.log('对象转字符串:', 对象转字符串.值());
console.log();

// ===== 2. 基本字符串操作 =====
console.log('2. 基本字符串操作:');

// 2.1 空白处理
const 带空格字符串 = new 字符串('  Hello  World  ');
console.log('原始字符串:', `"${带空格字符串.值()}"`);
console.log('去空格后:', `"${带空格字符串.去空格().值()}"`);

const 前空格字符串 = new 字符串('   前面有空格');
console.log('去前空格后:', `"${前空格字符串.去前空格().值()}"`);

const 后空格字符串 = new 字符串('后面有空格   ');
console.log('去后空格后:', `"${后空格字符串.去后空格().值()}"`);

// 2.2 大小写转换
const 混合字符串 = new 字符串('Hello World');
console.log('大写:', 混合字符串.大写().值());
console.log('小写:', 混合字符串.小写().值());
console.log('首字母大写:', new 字符串('hello world').首字母大写().值());
console.log('首字母小写:', new 字符串('HELLO WORLD').首字母小写().值());

// 2.3 字符串连接与重复
const 连接字符串1 = new 字符串('Hello');
console.log('拼接后:', 连接字符串1.拼接(' ', 'World').值());

const 重复字符串 = new 字符串('*');
console.log('重复5次:', 重复字符串.重复(5).值());
console.log();

// ===== 3. 字符串查询与判断 =====
console.log('3. 字符串查询与判断:');

const 测试字符串 = new 字符串('Hello World JavaScript');

// 3.1 长度相关
console.log('字符串长度:', 测试字符串.取长度());
console.log('是否为空:', new 字符串('').是否空());
console.log('是否空白:', new 字符串('   ').是否空白());

// 3.2 查找位置
console.log('查找"World":', 测试字符串.查找('World'));
console.log('反向查找"a":', 测试字符串.反向查找('a'));

// 3.3 包含判断
console.log('包含"JavaScript":', 测试字符串.包含('JavaScript'));
console.log('以"Hello"开头:', 测试字符串.以开头('Hello'));
console.log('以"Script"结尾:', 测试字符串.以结尾('Script'));

// 3.4 正则搜索
console.log('搜索数字:', 测试字符串.搜索(/\d/));
console.log('搜索单词:', 测试字符串.搜索(/\w+/g));

// 3.5 本地比较
console.log('本地比较:', 测试字符串.本地比较('Hello World'));
console.log();

// ===== 4. 正则匹配 =====
console.log('4. 正则匹配:');

const 正则字符串 = new 字符串('abc123def456');

// 4.1 匹配
console.log('匹配数字:', 正则字符串.匹配(/\d+/));
console.log('匹配所有数字:', 正则字符串.匹配(/\d+/g));

// 4.2 匹配所有（返回数组）
const 所有匹配 = 正则字符串.匹配所有数组(/\d+/g);
console.log('所有匹配结果:');
所有匹配.forEach(匹配 => console.log(`  - ${匹配[0]}`));
console.log();

// ===== 5. 字符串替换 =====
console.log('5. 字符串替换:');

const 替换字符串 = new 字符串('Hello World World');

// 5.1 单次替换
console.log('替换第一个"World":', 替换字符串.替换('World', 'JavaScript').值());

// 5.2 全局替换
const 全局替换字符串 = new 字符串('Hello World World');
console.log('替换所有"World":', 全局替换字符串.替换所有('World', 'JavaScript').值());

// 5.3 正则替换
const 正则替换字符串 = new 字符串('abc123def456');
console.log('替换所有数字为X:', 正则替换字符串.替换(/\d+/g, 'X').值());

// 5.4 函数替换
const 函数替换字符串 = new 字符串('abc123def456');
console.log('数字加1:', 函数替换字符串.替换(/\d+/g, m => parseInt(m) + 1).值());

// 5.5 忽略大小写替换
const 大小写替换字符串 = new 字符串('Hello HELLO hello');
console.log('忽略大小写替换hello:', 大小写替换字符串.替换_忽略大小写_所有('hello', 'Hi').值());
console.log();

// ===== 6. 字符串截取 =====
console.log('6. 字符串截取:');

const 截取字符串 = new 字符串('Hello World JavaScript');

// 6.1 substring
console.log('从6开始截取:', 截取字符串.取子串(6).值());
console.log('从6到11截取:', 截取字符串.取子串(6, 11).值());

// 6.2 slice
const 截取字符串2 = new 字符串('Hello World JavaScript');
console.log('slice(6):', 截取字符串2.取子片段(6).值());
console.log('slice(-10):', 截取字符串2.取子片段(-10).值());

// 6.3 substr
const 截取字符串3 = new 字符串('Hello World JavaScript');
console.log('substr(6, 5):', 截取字符串3.截取(6, 5).值());
console.log();

// ===== 7. 字符串拆分 =====
console.log('7. 字符串拆分:');

const 拆分字符串 = new 字符串('Hello,World,JavaScript');
console.log('按逗号拆分:', 拆分字符串.拆分(','));
console.log('按逗号拆分(限制2个):', 拆分字符串.拆分(',', 2));

// 多行文本拆分
const 多行文本 = new 字符串('第一行\n第二行\r第三行\r\n第四行');
console.log('按行拆分:', 多行文本.拆分为行());
console.log();

// ===== 8. 字符操作 =====
console.log('8. 字符操作:');

const 字符字符串 = new 字符串('Hello');

// 8.1 取字符
console.log('第1个字符:', 字符字符串.取字符(0));
console.log('第3个字符:', 字符字符串.取字符(2));
console.log('使用at方法:', 字符字符串.at(-1)); // 最后一个字符

// 8.2 编码相关
console.log('字符码:', 字符字符串.取编码(0));
console.log('从编码创建:', 字符串.从编码(72, 101, 108, 108, 111).值());

// 8.3 码点操作
const 表情字符串 = new 字符串('😊');
console.log('表情码点:', 表情字符串.码点取字符(0));
console.log('从码点创建:', 字符串.从码点(128522).值());
console.log();

// ===== 9. 字符串格式化 =====
console.log('9. 字符串格式化:');

// 9.1 填充
const 填充字符串 = new 字符串('123');
console.log('前填充到5位:', 填充字符串.填充前(5, '0').值());

const 填充字符串2 = new 字符串('123');
console.log('后填充到5位:', 填充字符串2.填充后(5, '*').值());

// 9.2 截断与填充
const 截断字符串 = new 字符串('HelloWorld');
console.log('截断到5位:', 截断字符串.截断并填充(5).值());

// 9.3 中间省略
const 长字符串 = new 字符串('这是一个很长很长很长很长的字符串');
console.log('中间省略:', 长字符串.中间省略(4, 4).值());
console.log();

// ===== 10. 格式转换 =====
console.log('10. 格式转换:');

// 10.1 命名格式转换
const 命名字符串 = new 字符串('hello-world_example');
console.log('驼峰命名:', 命名字符串.驼峰().值());

const 驼峰字符串 = new 字符串('helloWorldExample');
console.log('下划线命名:', 驼峰字符串.下划线().值());
console.log('中划线命名:', 驼峰字符串.中划线().值());
console.log('帕斯卡命名:', 驼峰字符串.帕斯卡().值());
console.log('标题式:', 驼峰字符串.标题式().值());

// 10.2 空白处理
const 多空格字符串 = new 字符串('Hello   World   JavaScript');
console.log('合并空白:', 多空格字符串.合并空白().值());
console.log('去除所有空格:', 多空格字符串.去除所有空格().值());

// 10.3 数组转换
const 转数组字符串 = new 字符串('Hello');
console.log('转为字符数组:', 转数组字符串.转为数组());
console.log();

// ===== 11. 编码与解码 =====
console.log('11. 编码与解码:');

// 11.1 URL编码
const url字符串 = new 字符串('https://example.com/search?q=JavaScript 教程');
console.log('URL编码:', url字符串.编码URI().值());

const urlComponent字符串 = new 字符串('JavaScript 教程');
console.log('URL组件编码:', urlComponent字符串.编码URI组件().值());

// 11.2 URL解码
const encoded字符串 = new 字符串('JavaScript%20%E6%95%99%E7%A8%8B');
console.log('URL解码:', encoded字符串.解码URI组件().值());

// 11.3 HTML转义
const html字符串 = new 字符串('<script>alert("XSS")</script>');
console.log('HTML转义:', html字符串.转义HTML().值());

const escaped字符串 = new 字符串('&lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;');
console.log('HTML反转义:', escaped字符串.反转义HTML().值());
console.log();

// ===== 12. 实用工具方法 =====
console.log('12. 实用工具方法:');

// 12.1 计数
const 计数字符串 = new 字符串('ababa');
console.log('"a"出现次数:', 计数字符串.计数('a'));
console.log('正则匹配次数:', 计数字符串.计数(/[ab]/g));

// 12.2 单词操作
const 单词字符串 = new 字符串('hello world javascript');
console.log('单词首字母大写:', 单词字符串.单词首字母大写().值());
console.log('包含单词"world":', 单词字符串.包含单词('world'));

// 12.3 前缀后缀处理
const 前缀后缀字符串 = new 字符串('prefix_content_suffix');
console.log('移除前缀:', 前缀后缀字符串.移除前缀('prefix_').值());
console.log('移除后缀:', 前缀后缀字符串.移除后缀('_suffix').值());

// 12.4 分隔处理
const 分隔字符串 = new 字符串('prefix-content-suffix');
console.log('取左侧:', 分隔字符串.取左('-').值());
const 分隔字符串2 = new 字符串('prefix-content-suffix');
console.log('取右侧:', 分隔字符串2.取右('-').值());

// 12.5 字符映射
const 映射字符串 = new 字符串('hello');
console.log('字符映射(转大写):', 映射字符串.映射字符(ch => ch.toUpperCase()).值());

// 12.6 正则转义
const 正则转义字符串 = new 字符串('a.b*c');
console.log('正则转义:', 正则转义字符串.转义正则().值());
console.log();

// ===== 13. 链式调用 =====
console.log('13. 链式调用:');

const 链式字符串 = new 字符串('  hello-world_example  ');
const 结果 = 链式字符串
  .去空格()
  .驼峰()
  .单词首字母大写()
  .填充后(20, '!')
  .值();

console.log('链式调用结果:', 结果);
console.log();

// ===== 14. 实际应用场景 =====
console.log('14. 实际应用场景:');

// 14.1 数据验证
function 验证邮箱(邮箱) {
  const 邮箱字符串 = new 字符串(邮箱);
  const 邮箱正则 = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return 邮箱字符串.匹配(邮箱正则) !== null;
}

console.log('验证邮箱:');
console.log('valid@example.com:', 验证邮箱('valid@example.com'));
console.log('invalid-email:', 验证邮箱('invalid-email'));

// 14.2 文本格式化
function 格式化电话号码(电话) {
  return new 字符串(电话)
    .去除所有空格()
    .替换(/^(\d{3})(\d{4})(\d{4})$/g, '$1-$2-$3')
    .值();
}

console.log('格式化电话号码:');
console.log('13812345678 ->', 格式化电话号码('13812345678'));
console.log('138 1234 5678 ->', 格式化电话号码('138 1234 5678'));

// 14.3 文件名处理
function 格式化文件名(原始名称) {
  return new 字符串(原始名称)
    .去除所有空格()
    .中划线()
    .替换(/[^a-z0-9-._]/g, '')
    .值();
}

console.log('格式化文件名:');
console.log('My Document.doc ->', 格式化文件名('My Document.doc'));
console.log('文档 1-最终版.pdf ->', 格式化文件名('文档 1-最终版.pdf'));

// 14.4 敏感信息脱敏
function 脱敏手机号(手机号) {
  if (!/^1[3-9]\d{9}$/.test(手机号)) return 手机号;
  return new 字符串(手机号)
    .替换(/(\d{3})\d{4}(\d{4})/, '$1****$2')
    .值();
}

function 脱敏邮箱(邮箱) {
  return new 字符串(邮箱)
    .替换(/(\w{1,3})[\w.-]*@(\w+\.\w+)/, '$1****@$2')
    .值();
}

console.log('信息脱敏:');
console.log('13812345678 ->', 脱敏手机号('13812345678'));
console.log('user@example.com ->', 脱敏邮箱('user@example.com'));
console.log('longusername@test.com ->', 脱敏邮箱('longusername@test.com'));

// 14.5 代码注释处理
function 提取注释(代码) {
  const 注释匹配 = new 字符串(代码).匹配所有数组(/\/\*[\s\S]*?\*\/|\/\/.*$/gm);
  return 注释匹配.map(m => m[0]);
}

const 代码示例 = `
// 这是单行注释
function test() {
  /* 这是
     多行注释 */
  console.log('Hello'); // 行尾注释
}
`;

console.log('提取注释:');
提取注释(代码示例).forEach((注释, 索引) => {
  console.log(`注释 ${索引 + 1}:`, 注释);
});

console.log('\n=== 字符串操作模块使用示例完成 ===');
